#封装数据库工具类
import pymysql

class DBUtil(object):
    conn = None
    #创建连接
    #添加__类方法变为私有，外部不能访问
    @classmethod
    def __create_connect(cls):
        #增加判断，连接只需建立一次，执行其他sql操作语句不再需要建立连接
        if cls.conn is None:
            cls.conn = pymysql.connect(host="127.3.0.28", port=8888, user="root",
                               password="admin123", database="test_db", charset="utf8")
        return cls.conn

    #关闭连接
    #装饰器，可以直接使用类名访问方法，不需要创建实例调用
    @classmethod
    def __close_connect(cls):
        #增加判断，不为空的时候需要关闭，关闭后就不需要再次关闭
        if cls.conn is not None:
            cls.conn.close()
            #不为空执行关闭操作，并把值置为空，后续不再执行关闭操作
            cls.conn = None

    #封装查询方法（查询一条）
    @classmethod
    def select_one(cls,sql):
        cursor = None
        res = None
        try:
            #调用创建连接函数
            cls.conn = cls.__create_connect()
            #获取游标
            cursor = cls.conn.cursor()
            #执行sql语句
            cursor.execute(sql)
            #提取数据
            res = cursor.fetchone()
        except Exception as e:
            print("查询错误：",str(e))

        finally:
            #关闭游标
            cursor.close()
            #关闭连接
            cls.__close_connect()
            #返回提取的数据
            return res

    #封装增删改方法
    @classmethod
    def iud_util(cls,sql):
        cursor = None
        try:
            # 调用创建连接函数
            cls.conn = cls.__create_connect()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行sql语句
            cursor.execute(sql)
            # 查看sql执行影响多少行
            print("影响的行数为：", cls.conn.affected_rows())
            #成功执行提交事务
            cls.conn.commit()
        except Exception as e:
            #失败执行回滚事务
            cls.conn.rollback()
            print("查询错误：",str(e))

        finally:
            #关闭游标
            cursor.close()
            #关闭连接
            cls.__close_connect()



if __name__ == '__main__':
    res1 = DBUtil.select_one("select * from test_book where id = 11")
    print(res1)
    DBUtil.iud_util("update test_book set book_name = '软件测试' where id = 11")

